home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ABERMUD.ZIP
/
GMAIN2.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-08
|
13KB
|
553 lines
#include "files.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "System.h"
char lump[256];
int namegiv=0;
char namegt[80];
int qnmrq=0;
/*
* Program starts Here!
*
* This forms the main loop of the code, as well as calling
* all the initialising pieces
*/
void main(argc,argv) /* The initial routine */
int argc;
char *argv[];
{
extern long ttyt;
long r;
FILE *a;
char user[80],b[40],space[400];
int num;
struct stat statbuf;
long ct;
/*
* Check we are running on the correct host
* see the notes about the use of flock();
* and the affects of lockf();
*/
gethostname(user,33);
if(strcmp(user,HOST_MACHINE))
{
fprintf(stderr,"AberMUD is only available on %s, not on %s\n",
HOST_MACHINE,user);
exit(1);
}
b[0]=0;b[1]=0;b[2]=0;
/*
*
* Check if there is a no logins file active
*
*
*/
printf("\n\n\n\n");
chknolog();
if ((argc==2)&&(argv[1][0]=='-'))
{
uppercase(argv[1]);
/*
* Now check the option entries
*
* -n(name)
*/
r=argv[1][1];
switch(r)
{
case 'N':
qnmrq=1;ttyt=0;strcpy(namegt,argv[1]+2);namegiv=1;break;
default:
getty();
}
}
else
getty();
num=0;
/*
* Check for all the created at stuff
*
* We use stats for this which is a UN*X system call
*
*/
if(!namegiv){
if(stat(EXE,&statbuf)== -1)strcpy(space,"<unknown>\n");
else
{
strcpy(space,ctime(&(statbuf.st_mtime)));
}
cls();
printf("\
A B E R M U D\n");printf("\
By Alan Cox, Richard Acott Jim Finnis\n\n");
printf("This AberMUD was created:%s",space);
a=fopen(RESET_N,"r");
if(a==NULL)
{
printf("AberMUD has yet to ever start!!!\n");
goto skip;
}
fscanf(a,"%ld",&r);
fclose(a);
time(&ct);
r=ct-r;
/*
*
* Elapsed time and similar goodies
*
*/
if(r>24*60*60)
{
printf("Game time elapsed: Over a day!!!\n"); /* Add a Day ! */
goto skip;
}
printf("Game time elapsed: ");
if(r<61) goto ski2;
if(r==60) {printf("1 minute\n");goto skip;};
if(r<120){printf("1 minute and ");goto ski2;}
if(r/60==60){printf("1 hour\n");goto skip;}
if(r<3600) {printf("%d minutes and ",r/60);goto ski2;}
if(r<7200) printf("1 hour and ");
else
printf("%d hours and ",r/3600);
if((r/60)%60!=1) printf("%d minutes.\n",(r/60)%60);
else
printf("1 minute\n");
goto skip;
ski2:if(r%60==1) printf("1 second\n");
else
printf("%d seconds.\n",r%60);
}
skip:login(user); /* Does all the login stuff */
if(!qnmrq)
{
cls();
listfl(MOTD); /* list the message of the day */
gets(space);
printf("\n\n");
}
cuserid(space);
syslog("Game entry by %s : UID %s",user,space); /* Log entry */
talker(user); /* Run system */
crapup("Bye Bye"); /* Exit */
}
char usrnam[44];
void login(user) /* The whole login system is called from this */
char *user;
{
long un1;
char usermc[80],a[80],tim[80],dat[80],c;
/*
*
* Check if banned first
*
*/
chkbnid(cuserid(NULL));
/*
* Get the user name
*
*/
if(!namegiv)
{
rena:printf("By what name shall I call you ?\n*");
getkbd(user,15);
}
else
strcpy(user,namegt);
/*
* Check for legality of names
*
*/
namegiv=0;
if (!strlen(user)) goto rena;
if (any('.',user)>-1) crapup("\nIllegal characters in user name\n");
trim(user);
scan(user,user,0," ","");
if (!strlen(user)) goto rena;
chkname(user);
if(!strlen(user)) goto rena;
strcpy(dat,user); /* Gets name tidied up */
strcpy(usrnam,user);
if(!validname(usrnam)) crapup("Bye Bye");
if (logscan(dat,a)== -1) /* If he/she doesnt exist */
{
printf("\nDid I get the name right %s ?",user);
gets(a);lowercase(a);c=a[0];
if (c=='n') {printf("\n");goto rena;} /* Check name */
}
logpass(user); /* Password checking */
}
int chkbnid(user) /* Check to see if UID in banned list */
char *user;
{
FILE *a;
char b[80],c[40];
extern char *strchr();
strcpy(c,user);
lowercase(c);
a=openlock(BAN_FILE,"r+");
if(a==NULL) return(0);
while (fgets(b,79,a)!=0)
{
if(strchr(b,'\n')) *strchr(b,'\n')=0;
lowercase(b);
if (strcmp(b,user)==0)
{
crapup("I'm sorry- that userid has been banned from the Game\n");
}
}
fclose(a);
}
long logscan(uid,block) /* Return block data for user or -1 if not exist */
char *uid;
char *block;
{
FILE *unit;
long f;
extern char lump[];
char wkng[128],wk2[128];
strcpy(wk2,uid);
unit=openlock(PFL,"r");f=0;
if(unit==NULL) crapup("No persona file\n");
while((f==0)&&(fgets(block,255,unit)!=0))
{
dcrypt(block,lump,strlen(block));
strcpy(block,lump);
scan(wkng,block,0,"",".");
if (strcmp(lowercase(wkng),lowercase(wk2))==0)f=1;
}
fclose(unit);
if (f==0) return(-1);
return(1);
}
void logpass(uid) /* Main login code */
char *uid;
{
long a,tries,b;
char pwd[32],sigf[128],pvs[32],block[128];
FILE *fl;
a=logscan(uid,block);
strcpy(pwd,uid); /* save for new user */
if (a==1)
{
a=scan(uid,block,0,"",".");
a=scan(pwd,block,a+1,"",".");
tries=0;
pastry:printf("\nThis persona already exists, what is the password ?\n*");
fflush(stdout);
gepass(block);
printf("\n");
if (strcmp(block,pwd))
{
if (tries<2) {tries++;goto pastry;}
else
crapup("\nNo!\n\n");
}
}
else
/* this bit registers the new user */
{
printf("Creating new persona...\n");
printf("Give me a password for this persona\n");
repass:printf("*");fflush(stdout);
gepass(block);
printf("\n");
if (any('.',block)!= -1)
{
printf("Illegal character in password\n");
goto repass;
}
if (!strlen(block)) goto repass;
strcpy(uid,pwd);
strcpy(pwd,block);
sprintf(block,"%s%s%s%s",uid,".",pwd,"....");
fl=openlock(PFL,"a");
if(fl==NULL)
{
crapup("No persona file....\n");
return;
}
qcrypt(block,lump,strlen(block));
strcpy(block,lump);
fprintf(fl,"%s\n",block);
fclose(fl);
}
cls();
}
void getunm(name)
char *name;
{
printf("\nUser Name:");
gets(name);
}
void showuser()
{
long a;
char name[80],block[256];
cls();
getunm(name);
shu(name,block);
printf("\nHit Return...\n");
while(getchar()!='\n');
}
long shu(name,block) /* for show user and edit user */
char *name,*block;
{
long a;
long x;
char nm[128],pw[128],pr[128],pv[128];
a=logscan(name,block);
if (a== -1) printf("\nNo user registered in that name\n\n\n");
else
{
printf("\n\nUser Data For %s\n\n",name);
x=scan(nm,block,0,"",".");
x=scan(pw,block,x+1,"",".");
printf("Name:%s\nPassword:%s\n",nm,pw);
}
return(a);
}
void deluser()
{
long a;
char name[80],block[256];
getunm(name);
a=logscan(name,block);
if (a== -1) printf("\nCannot delete non-existant user\n");
else
{
delu2(name);
}
}
void edituser()
{
long a;
FILE *fl;
char name[80],block[256],bk2[256];
char nam2[128],pas2[128],per2[128],pr2[128];
cls();
getunm(name);
a=shu(name,block);
if (a== -1) sprintf(block,"%s%s",name,".default.E..");
a=scan(nam2,block,0,"",".");
a=scan(pas2,block,a+1,"",".");
printf("\nEditing : %s\n\n",name);
ed_fld("Name:",nam2);
ed_fld("Password:",pas2);
sprintf(bk2,"%s%s%s%s%s%s%s%s",nam2,".",pas2,".",".",".",".",".");
delu2(name);
fl=openlock(PFL,"a");
if(fl==NULL) return;
qcrypt(bk2,lump,strlen(bk2));
strcpy(bk2,lump);
fprintf(fl,"%s\n",bk2);
fclose(fl);
}
void ed_fld(name,string)
char *name,*string;
{
char bk[128];
bafld:printf("%s(Currently %s ):",name,string);
gets(bk);
if(bk[0]=='.') strcpy(bk,"");
if(strchr(bk,'.')){printf("\nInvalid Data Field\n");goto bafld;}
if (strlen(bk)) strcpy(string,bk);
}
void delu2(name) /* For delete and edit */
char *name;
{
char b2[128],buff[128];
FILE *a;
FILE *b;
char b3[128];
a=openlock(PFL,"r+");
b=openlock(PFT,"w");
if(a==NULL) return;
if(b==NULL) return;
while(fgets(buff,128,a)!=0)
{
dcrypt(buff,lump,strlen(buff)-1);
scan(b2,lump,0,"",".");
strcpy(b3,name);lowercase(b3);
if (strcmp(b3,lowercase(b2))) fprintf(b,"%s",buff);
}
fclose(a);
fclose(b);
a=openlock(PFL,"w");
b=openlock(PFT,"r+");
if(a==NULL) return;
if(b==NULL) return;
while(fgets(buff,128,b)!=0)
{
fprintf(a,"%s",buff);
}
fclose(a);
fclose(b);
}
void chpwd(user) /* Change your password */
char *user;
{
char block[128],data[128],pwd[80],pv[80];
long a;
FILE *fl;
strcpy(data,user);
logscan(user,block);
strcpy(user,data);
a=scan(data,block,0,"",".");
a=scan(pwd,block,a+1,"",".");
printf("\nOld Password\n*");
fflush(stdout);
gepass(data);
if(strcmp(data,pwd)) printf("\nIncorrect Password\n");
else
{
printf("\nNew Password\n");
chptagn:printf("*");
fflush(stdout);
gepass(pwd);
printf("\n");
if (!strlen(pwd)) goto chptagn;
if (strchr(pwd,','))
{
printf("Illegal Character in password\n");
goto chptagn;
}
printf("\nVerify Password\n*");
gepass(pv);
printf("\n");
if (strcmp(pv,pwd))
{
printf("\nNO!\n");
goto chptagn;
}
sprintf(block,"%s%s%s%s%s%s%s%s",user,".",pwd,".",".",".",".",".");
delu2(user); /* delete me and tack me on end! */
fl=openlock(PFL,"a");
if(fl==NULL) return;
qcrypt(block,lump,strlen(block));
strcpy(block,lump);
fprintf(fl,"%s\n",block);
fclose(fl);
printf("Changed\n");
}
}
char *getkbd(s,l) /* Getstr() with length limit and filter ctrl */
char *s;
int l;
{
char c,f,n;
f=0;c=0;
while(c<l)
{
regec:n=getchar();
if ((n<' ')&&(n!='\n')) goto regec;
if (n=='\n') {s[c]=0;f=1;c=l-1;}
else
s[c]=n;
c++;
}
if (f==0) {s[c]=0;while(getchar()!='\n');}
return(s);
}
void listfl(name)
char *name;
{
FILE * unit;
char string[82];
printf("\n");
unit=openlock(name,"r+");
if (unit==NULL)
{
printf("[Cannot Find -> %s]\n",name);
return;
}
while(fgets(string,128,unit)!=0)
{
printf("%s",string);
}
fclose(unit);
printf("\n");
}
void crapup(ptr)
char *ptr;
{
printf("\n%s\n\nHit Return to Continue...\n",ptr);
gets(ptr);
exit();
}
/*
* This is just a trap for debugging it should never get
* called.
*/
void bprintf()
{
printf("EEK - A function has trapped via the bprintf call\n");
exit(0);
}
int chkname(user)
char *user;
{
long a;
a=0;
lowercase(user);
while(user[a])
{
if(user[a]>'z') {user[a]=0;return(-1); }
if(user[a]<'a') {user[a]=0;return(-1);}
a++;
}
user[0]-=32;
return(0);
}
void chknolog()
{
FILE *a;
char b[128];
a=fopen(NOLOGIN,"r");
if(a==NULL) return;
while(fgets(b,128,a))
{
printf("%s",b);
}
fclose(a);
exit(0);
}